<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //一.JS堆和栈的了解
    //1.JS的数据类型
    //基本类型：number/string/boolean/undefined/null
    //引用类型：object

    //2.赋值(值传递和引用传递)
    //基本类型
    //栈：自动分配内存空间，系统自动释放，基本类型的值和引用类型（object）的地址
    //基本类型遵循值传递。
    var a = 10;
    var b = a; //值传递  将a的值赋值给b
    b++;
    console.log(a); //10
    console.log(b); //11

    //堆：动态分配的内存，大小不定，也不会自动释放。存放引用类型的值。
    //引用类型遵循引用传递，传递的是地址。
    // var arr1 = [1, 2, 3];
    // var arr2 = arr1;//地址传递，将arr1的地址传给arr2,相当于arr1和arr2的地址一样的。
    // arr2.push(4);
    // console.log(arr1); //[1,2,3,4]
    // console.log(arr2); //[1,2,3,4]

    //如何解决对象间的赋值 - 重新开辟地址，逐个赋值。
    var arr1 = [1, 2, 3];
    var arr2 = []; //重新开辟地址

    //浅拷贝
    for (var i = 0; i < arr1.length; i++) {
        arr2[i] = arr1[i];
    }
    arr2.push(4);
    console.log(arr1); //[1,2,3]
    console.log(arr2); //[1,2,3,4]


    console.log([] == []); //false 比较的也是地址

    //总结：
    //基本类型遵循值传递，任意传值，引用类型遵循引用传递，不能直接赋值，拷贝方式进行赋值。
    //栈里面存放基本类型的值和引用类型的地址，堆里面存放引用类型的值。
</script>